Unit Testing এবং Integration Testing

Microsoft Technologies - এএসপি ডট নেট কোর (ASP.Net Core)
258
258

Unit Testing এবং Integration Testing হল সফটওয়্যার টেস্টিংয়ের দুটি গুরুত্বপূর্ণ স্তর, যা অ্যাপ্লিকেশন বা সিস্টেমের কোডের ভিন্ন ভিন্ন অংশের কার্যকারিতা পরীক্ষা করতে ব্যবহৃত হয়। যদিও উভয়ই সফটওয়্যার কোডের গুণগত মান যাচাই করতে সহায়ক, তবে তাদের উদ্দেশ্য এবং পরীক্ষার ক্ষেত্র আলাদা।


Unit Testing

Unit Testing হল একটি প্রোগ্রামিং পরীক্ষার পদ্ধতি যেখানে কোডের একটি ছোট অংশ (একক ইউনিট) পরীক্ষা করা হয়। এই ইউনিটগুলি সাধারণত একটি মেথড, ফাংশন বা ক্লাসের একটি নির্দিষ্ট অংশ। Unit testing-এর মূল উদ্দেশ্য হল নিশ্চিত করা যে প্রতিটি ইউনিট আলাদাভাবে সঠিকভাবে কাজ করছে। এটি ডেভেলপমেন্ট প্রক্রিয়ায় বাগ চিহ্নিত করতে সাহায্য করে এবং কোডের উপর দ্রুত ধারণা লাভ করা সম্ভব করে।

Unit Testing এর বৈশিষ্ট্য:

  • একমাত্র ফাংশন বা মেথড পরীক্ষা করা হয়: Unit Testing শুধুমাত্র একটি নির্দিষ্ট মেথড বা ফাংশনের ফলাফল পরীক্ষা করে, যাতে কোডের ছোট অংশের কার্যকারিতা নিশ্চিত করা যায়।
  • স্বাধীন পরীক্ষণ: ইউনিট টেস্ট সাধারণত অন্য কোড বা সিস্টেম উপাদান থেকে স্বাধীনভাবে কাজ করে।
  • ডেটা স্টাবিং এবং মকিং: স্টাবিং (Mocking) এবং ফেক (Fake) ডেটার মাধ্যমে ইউনিট টেস্টের জন্য ডেটা তৈরি করা হয়, যাতে কোন বাহ্যিক সিস্টেম বা ডেটাবেসের প্রভাব না পড়ে।

Unit Testing এর উদাহরণ:

ধরা যাক, একটি অ্যাডিশন ফাংশন যা দুটি সংখ্যার যোগফল নির্ণয় করে:

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

এখন, xUnit ব্যবহার করে এই Add মেথডের Unit Test করা হবে:

using Xunit;

public class CalculatorTests
{
    [Fact]
    public void Add_ShouldReturnCorrectSum_WhenGivenTwoNumbers()
    {
        // Arrange
        var calculator = new Calculator();
        int a = 5;
        int b = 10;

        // Act
        var result = calculator.Add(a, b);

        // Assert
        Assert.Equal(15, result);
    }
}

এখানে:

  • Arrange: টেস্টের জন্য প্রয়োজনীয় ডেটা প্রস্তুত করা।
  • Act: ফাংশন বা মেথড কল করা।
  • Assert: ফলাফল যাচাই করা।

Unit Testing এর সুবিধা:

  • কোডের নির্ভরযোগ্যতা বৃদ্ধি: ইউনিট টেস্টের মাধ্যমে কোডের মান বজায় থাকে এবং ভবিষ্যতে পরিবর্তন করা হলে কোডটি সঠিকভাবে কাজ করবে কিনা তা পরীক্ষা করা যায়।
  • ডেভেলপমেন্টের সময় কমে যায়: কোড লেখা এবং টেস্ট করার সময় একসাথে চলতে পারে, ফলে বাগ সনাক্ত করা দ্রুত হয়।

Unit Testing এর সীমাবদ্ধতা:

  • বাহ্যিক নির্ভরশীলতা পরীক্ষা করা যায় না: অন্যান্য সিস্টেম, যেমন ডেটাবেস বা তৃতীয় পক্ষের সেবা, ইউনিট টেস্টে পরীক্ষা করা যায় না।
  • কোডের পূর্ণতা পরীক্ষা করা যায় না: কোডের ভেতরের অন্যান্য অংশের সাথে সংযোগের প্রভাব পরীক্ষা করতে ইনটিগ্রেশন টেস্ট প্রয়োজন।

Integration Testing

Integration Testing হল একটি টেস্টিং প্রক্রিয়া যেখানে একাধিক ইউনিট বা কম্পোনেন্টকে একত্রে পরীক্ষা করা হয়, যাতে তাদের মধ্যে সঠিকভাবে যোগাযোগ হচ্ছে কিনা এবং একে অপরের সাথে ঠিকভাবে কাজ করছে কিনা তা যাচাই করা যায়। Integration Testing মূলত নিশ্চিত করে যে সিস্টেমের বিভিন্ন অংশ একে অপরের সাথে সঠিকভাবে ইন্টিগ্রেট করছে এবং কোনও ত্রুটি সৃষ্টি করছে না।

Integration Testing এর বৈশিষ্ট্য:

  • বিভিন্ন ইউনিটের ইন্টিগ্রেশন পরীক্ষা করা হয়: একাধিক ইউনিটের মধ্যে ইন্টারঅ্যাকশন এবং একে অপরের সাথে কাজ করার সক্ষমতা যাচাই করা হয়।
  • ডাটাবেস, API, এবং অন্যান্য সিস্টেম: অন্যান্য সিস্টেমের সাথে সংযোগ যেমন ডাটাবেস বা API ব্যবহার করে পরীক্ষা করা যায়।
  • যথার্থ ফলাফল প্রাপ্তি: ইউনিট টেস্টে কোন ভুল থাকলে তা ইন্টিগ্রেশন টেস্টে ধরা পড়ে, কারণ পুরো সিস্টেম একত্রে পরীক্ষা করা হয়।

Integration Testing এর উদাহরণ:

ধরা যাক, আমরা একটি OrderService ক্লাস তৈরি করেছি, যা একটি ডাটাবেস থেকে অর্ডার তথ্য নিয়ে আসে:

public class OrderService
{
    private readonly IOrderRepository _orderRepository;

    public OrderService(IOrderRepository orderRepository)
    {
        _orderRepository = orderRepository;
    }

    public Order GetOrderById(int id)
    {
        return _orderRepository.GetOrderById(id);
    }
}

এখন, আমরা Integration Test লিখতে পারি যেখানে OrderService এবং IOrderRepository ইন্টিগ্রেট করা হচ্ছে:

using Xunit;

public class OrderServiceIntegrationTests
{
    [Fact]
    public void GetOrderById_ShouldReturnOrder_WhenOrderExists()
    {
        // Arrange
        var orderRepository = new Mock<IOrderRepository>();
        orderRepository.Setup(r => r.GetOrderById(It.IsAny<int>())).Returns(new Order { Id = 1, Name = "Sample Order" });
        var orderService = new OrderService(orderRepository.Object);

        // Act
        var order = orderService.GetOrderById(1);

        // Assert
        Assert.NotNull(order);
        Assert.Equal(1, order.Id);
        Assert.Equal("Sample Order", order.Name);
    }
}

এখানে:

  • Arrange: প্রয়োজনীয় ডাটাবেস বা সিস্টেমের মক তৈরি করা হয়।
  • Act: OrderService এবং IOrderRepository এর মধ্যে সংযোগ পরীক্ষা করা হয়।
  • Assert: পরীক্ষিত ফাংশন থেকে প্রাপ্ত ফলাফল যাচাই করা হয়।

Integration Testing এর সুবিধা:

  • সিস্টেমের একাধিক অংশের মধ্যে সম্পর্ক যাচাই: এটি বিভিন্ন ইউনিট বা সিস্টেমের একসাথে কাজ করার সক্ষমতা পরীক্ষা করে।
  • ডেটাবেস এবং API ইন্টিগ্রেশন পরীক্ষা: প্রকৃত ডেটাবেস বা API ব্যবহার করে ইন্টিগ্রেশন পরীক্ষা করা সম্ভব।

Integration Testing এর সীমাবদ্ধতা:

  • কোডের স্বাধীনতা হারানো: যখন বিভিন্ন কম্পোনেন্ট একত্রে পরীক্ষা করা হয়, তখন এককভাবে কোনও ইউনিট পরীক্ষার জন্য কোড কঠিন হতে পারে।
  • পরীক্ষা করা হয় পুরো সিস্টেম: এতে সম্পূর্ণ সিস্টেমের জন্য টেস্ট তৈরি করতে অনেক সময় ও পরিশ্রম প্রয়োজন হয়।

Unit Testing এবং Integration Testing এর মধ্যে পার্থক্য

বৈশিষ্ট্যUnit TestingIntegration Testing
ফোকাসকোডের একক ইউনিট বা ফাংশন পরীক্ষা করা হয়।একাধিক ইউনিট বা সিস্টেমের মধ্যে ইন্টিগ্রেশন পরীক্ষা করা হয়।
স্বাধীনতাঅন্যান্য কম্পোনেন্ট থেকে স্বাধীন।একাধিক কম্পোনেন্টের ইন্টিগ্রেশন প্রক্রিয়া পরীক্ষা করা হয়।
পরীক্ষা করা হয়শুধুমাত্র একটি ফাংশন বা মেথড।একাধিক ফাংশন বা মেথড, যেমন ডাটাবেস বা API।
বাহ্যিক নির্ভরশীলতাবাহ্যিক সিস্টেম বা ডেটাবেসের সাথে যোগাযোগ করা হয় না।ডেটাবেস, API বা অন্যান্য সিস্টেমের সাথে ইন্টিগ্রেশন পরীক্ষা করা হয়।
টেস্টের স্কেলছোট, একক পরীক্ষা।বড়, সিস্টেমের একাধিক অংশ পরীক্ষা।

সারাংশ

Unit Testing এবং Integration Testing উভয়ই সফটওয়্যার টেস্টিংয়ের গুরুত্বপূর্ণ অংশ। Unit Testing ছোট ছোট ইউনিট পরীক্ষা করে এবং নিশ্চিত করে যে কোডের প্রতিটি অংশ সঠিকভাবে কাজ করছে। অপরদিকে, Integration Testing একাধিক ইউনিট বা সিস্টেমের মধ্যে ইন্টিগ্রেশন পরীক্ষা করে এবং নিশ্চিত করে যে তারা একত্রে সঠিকভাবে কাজ করছে। উভয় ধরনের টেস্টিং সিস্টেমের গুণগত মান নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে এবং সফটওয়্যার ডেভেলপমেন্টের প্রক্রিয়া সহজ করে।

common.content_added_by

ASP.NET Core অ্যাপের জন্য Unit Test লিখা (xUnit ব্যবহার)

218
218

Unit Testing হলো সফটওয়্যার ডেভেলপমেন্টের একটি গুরুত্বপূর্ণ অংশ, যা অ্যাপ্লিকেশনের ছোট ছোট ইউনিট বা কম্পোনেন্টের কার্যকারিতা পরীক্ষা করে। xUnit হলো একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক, যা ASP.NET Core অ্যাপের জন্য সহজে Unit Test লিখতে সাহায্য করে। এটি দ্রুত, মডিউলার, এবং সহজবোধ্য টেস্টিং ফিচার প্রদান করে।


xUnit ইনস্টল করা

xUnit ব্যবহার করতে আপনার ASP.NET Core প্রজেক্টে xUnit NuGet প্যাকেজ ইনস্টল করতে হবে।

টেস্ট প্রজেক্ট তৈরি করা

একটি আলাদা টেস্ট প্রজেক্ট তৈরি করতে নিচের কমান্ড ব্যবহার করুন:

dotnet new xunit -n MyApp.Tests

MyApp.Tests টেস্ট প্রজেক্টের জন্য নির্ধারিত নাম।

ASP.NET Core অ্যাপের রেফারেন্স যোগ করা

আপনার মূল অ্যাপ্লিকেশন প্রজেক্টকে টেস্ট প্রজেক্টে রেফারেন্স হিসেবে যোগ করুন:

dotnet add reference ../MyApp/MyApp.csproj

টেস্ট ক্লাস এবং মেথড তৈরি

উদাহরণ: ASP.NET Core Service ক্লাস

একটি সাধারণ CalculatorService ক্লাস, যা যোগ এবং বিয়োগ ফাংশনালিটি প্রদান করে:

public class CalculatorService
{
    public int Add(int a, int b) => a + b;
    public int Subtract(int a, int b) => a - b;
}

xUnit ব্যবহার করে Unit Test লেখা

MyApp.Tests প্রজেক্টে একটি টেস্ট ক্লাস তৈরি করুন (যেমন CalculatorServiceTests.cs) এবং টেস্ট লিখুন।

using Xunit;

public class CalculatorServiceTests
{
    [Fact]
    public void Add_ReturnsSumOfTwoNumbers()
    {
        // Arrange
        var calculator = new CalculatorService();
        int a = 5, b = 3;

        // Act
        int result = calculator.Add(a, b);

        // Assert
        Assert.Equal(8, result);
    }

    [Fact]
    public void Subtract_ReturnsDifferenceOfTwoNumbers()
    {
        // Arrange
        var calculator = new CalculatorService();
        int a = 10, b = 4;

        // Act
        int result = calculator.Subtract(a, b);

        // Assert
        Assert.Equal(6, result);
    }
}

ব্যাখ্যা:

  • Arrange: টেস্টের জন্য প্রয়োজনীয় ডেটা এবং অবজেক্ট তৈরি করা।
  • Act: টেস্ট করা মেথড কল করা।
  • Assert: মেথডের আউটপুট যাচাই করা।

Dependency Injection এর সাথে Unit Test

ASP.NET Core অ্যাপ্লিকেশন সাধারণত Dependency Injection (DI) ব্যবহার করে। টেস্টিংয়ে DI ব্যবহারের জন্য Mocking ফ্রেমওয়ার্ক (যেমন Moq) প্রয়োজন।

উদাহরণ: DI এর মাধ্যমে সার্ভিস টেস্ট

IWeatherService ইন্টারফেস এবং একটি ইমপ্লিমেন্টেশন:

public interface IWeatherService
{
    string GetWeather();
}

public class WeatherService : IWeatherService
{
    public string GetWeather() => "Sunny";
}

Controller:

[ApiController]
[Route("[controller]")]
public class WeatherController : ControllerBase
{
    private readonly IWeatherService _weatherService;

    public WeatherController(IWeatherService weatherService)
    {
        _weatherService = weatherService;
    }

    [HttpGet]
    public string Get()
    {
        return _weatherService.GetWeather();
    }
}

টেস্ট লিখা Moq ব্যবহার করে

Moq ব্যবহার করে DI এর জন্য Mock করা যায়। Moq প্যাকেজ ইন্সটল করুন:

dotnet add package Moq

টেস্ট ক্লাস:

using Moq;
using Xunit;

public class WeatherControllerTests
{
    [Fact]
    public void Get_ReturnsWeatherFromService()
    {
        // Arrange
        var mockWeatherService = new Mock<IWeatherService>();
        mockWeatherService.Setup(service => service.GetWeather()).Returns("Cloudy");

        var controller = new WeatherController(mockWeatherService.Object);

        // Act
        var result = controller.Get();

        // Assert
        Assert.Equal("Cloudy", result);
    }
}

ব্যাখ্যা:

  • Mock: IWeatherService ইন্টারফেসের একটি মক তৈরি করা।
  • Setup: মকের মেথডের জন্য প্রত্যাশিত রিটার্ন ভ্যালু নির্ধারণ করা।
  • Assert.Equal: Controller এর আউটপুট যাচাই করা।

Unit Test রান করা

টেস্ট চালানোর জন্য নিচের কমান্ড ব্যবহার করুন:

dotnet test

ফলাফল

Unit Test সফলভাবে রান হলে নিচের আউটপুট দেখতে পাবেন:

Passed! 2 tests.

Unit Testing এর সুবিধা

  • রিগ্রেশন এড়ানো: কোড পরিবর্তনের ফলে বিদ্যমান ফিচারে সমস্যা এড়ানো যায়।
  • কোডের মান বৃদ্ধি: কোড আরও মডিউলার এবং টেস্টেবল হয়।
  • ডেভেলপমেন্ট সময় বাঁচানো: সমস্যা দ্রুত সনাক্ত করা সম্ভব।

xUnit ব্যবহার করে ASP.NET Core অ্যাপের জন্য সহজেই শক্তিশালী Unit Test তৈরি করা যায়, যা অ্যাপ্লিকেশনের মান এবং স্থায়িত্ব বাড়ায়।

common.content_added_by

Mocking Framework (Moq) ব্যবহার করে Unit Testing

206
206

Moq হলো .NET অ্যাপ্লিকেশনের জন্য একটি জনপ্রিয় Mocking Framework, যা Unit Testing এর সময় ডিপেনডেন্সি মক করার সুবিধা প্রদান করে। এটি বিশেষভাবে Dependency Injection ভিত্তিক অ্যাপ্লিকেশনের জন্য কার্যকর। Moq Framework ব্যবহার করে, আপনি ডিপেনডেন্ট অবজেক্টের মক (Mock) তৈরি করতে পারেন এবং তাদের আচরণ নিয়ন্ত্রণ করতে পারেন।

Unit Testing-এ মকিং ব্যবহারের মাধ্যমে আপনি External Dependencies (যেমন ডাটাবেস, API, বা সার্ভিস) সরিয়ে ফেলে শুধুমাত্র টেস্ট করা ক্লাসের কার্যকলাপ নিশ্চিত করতে পারেন।


Moq Framework এর গুরুত্ব

  1. ডিপেনডেন্সি রিমুভ করা: Moq ব্যবহার করে আপনি ডিপেনডেন্ট ক্লাস বা ইন্টারফেস মক করতে পারেন।
  2. সিমুলেটেড ডেটা: টেস্টিংয়ের জন্য সিমুলেটেড ডেটা সরবরাহ করা যায়।
  3. ডিটারমিনিস্টিক টেস্টিং: নির্দিষ্ট আউটপুট নিশ্চিত করতে কাস্টম সিমুলেশন তৈরি করা যায়।
  4. টেস্টের গতি বৃদ্ধি: ডাটাবেস বা API এর মতো এক্সটার্নাল সার্ভিসে নির্ভর না করে টেস্ট দ্রুততর হয়।

Moq ইনস্টল করা

Moq Framework ব্যবহার করার জন্য NuGet Package Manager বা dotnet CLI ব্যবহার করে প্যাকেজ ইন্সটল করতে পারেন:

NuGet Package Manager:

Visual Studio এর NuGet Package Manager থেকে Moq ইনস্টল করুন।

dotnet CLI:

dotnet add package Moq

Moq এর সাথে Unit Test লেখার ধাপ

১. ইন্টারফেস তৈরি করুন

Moq সাধারণত ইন্টারফেসের উপর কাজ করে, কারণ মক করার জন্য এটি ডিপেনডেন্সি ইনজেকশন ব্যবহার করে।

উদাহরণস্বরূপ, একটি IUserRepository ইন্টারফেস যেখানে ডেটাবেস অপারেশন থাকে:

public interface IUserRepository
{
    User GetUserById(int id);
    void AddUser(User user);
}

২. ক্লাস তৈরি করুন যা ইন্টারফেস ব্যবহার করে

UserService ক্লাস, যেখানে IUserRepository এর উপর নির্ভরশীলতা রয়েছে:

public class UserService
{
    private readonly IUserRepository _userRepository;

    public UserService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public string GetUserNameById(int id)
    {
        var user = _userRepository.GetUserById(id);
        return user != null ? user.Name : "User not found";
    }
}

৩. Unit Test তৈরি করুন

UserService ক্লাসের জন্য Unit Test লিখতে হবে। এখানে আমরা Moq ব্যবহার করে IUserRepository মক করব।

টেস্ট ফাইল:
using Moq;
using Xunit;

public class UserServiceTests
{
    [Fact]
    public void GetUserNameById_UserExists_ReturnsUserName()
    {
        // Arrange
        var mockUserRepository = new Mock<IUserRepository>();
        mockUserRepository.Setup(repo => repo.GetUserById(1))
                          .Returns(new User { Id = 1, Name = "John Doe" });

        var userService = new UserService(mockUserRepository.Object);

        // Act
        var result = userService.GetUserNameById(1);

        // Assert
        Assert.Equal("John Doe", result);
    }

    [Fact]
    public void GetUserNameById_UserDoesNotExist_ReturnsUserNotFound()
    {
        // Arrange
        var mockUserRepository = new Mock<IUserRepository>();
        mockUserRepository.Setup(repo => repo.GetUserById(2))
                          .Returns((User)null);

        var userService = new UserService(mockUserRepository.Object);

        // Act
        var result = userService.GetUserNameById(2);

        // Assert
        Assert.Equal("User not found", result);
    }
}

কোড বিশ্লেষণ

Mock Object তৈরি করা

var mockUserRepository = new Mock<IUserRepository>();

Moq ব্যবহার করে IUserRepository এর একটি মক ইন্সট্যান্স তৈরি করা হয়েছে।

মক সেটআপ করা

mockUserRepository.Setup(repo => repo.GetUserById(1))
                  .Returns(new User { Id = 1, Name = "John Doe" });

GetUserById(1) মেথডটি কল হলে এটি একটি নির্দিষ্ট মান User ফেরত দেবে।

মক অবজেক্ট পাস করা

var userService = new UserService(mockUserRepository.Object);

মক করা অবজেক্ট userService এর কনস্ট্রাক্টরে পাস করা হয়েছে।

অ্যাসার্ট করা

Assert.Equal("John Doe", result);

পরীক্ষা করা হচ্ছে যে GetUserNameById(1) মেথডটি সঠিক ফলাফল ফেরত দিচ্ছে কিনা।


Moq-এর উন্নত বৈশিষ্ট্য

ভেরিফিকেশন

Moq দিয়ে নিশ্চিত করা যায় যে একটি নির্দিষ্ট মেথড নির্দিষ্ট সংখ্যক বার কল করা হয়েছে কিনা।

mockUserRepository.Verify(repo => repo.GetUserById(1), Times.Once);

এটি নিশ্চিত করবে যে GetUserById(1) শুধুমাত্র একবার কল হয়েছে।

Exception নিক্ষেপ

মক মেথড একটি নির্দিষ্ট Exception ছুঁড়তে পারে:

mockUserRepository.Setup(repo => repo.AddUser(It.IsAny<User>()))
                  .Throws(new Exception("Database error"));

Moq ব্যবহার করার সুবিধা

  1. External Dependency রিমুভ করা: ডাটাবেস, API, বা অন্য কোনো এক্সটার্নাল সিস্টেমের প্রয়োজন নেই।
  2. ফাস্ট এবং নির্ভরযোগ্য টেস্টিং: মকিং ব্যবহারের মাধ্যমে টেস্ট দ্রুত রান করে এবং নির্ভুল ফলাফল দেয়।
  3. ফ্লেক্সিবল সিমুলেশন: বিভিন্ন টেস্ট কেস তৈরি করার জন্য Moq অত্যন্ত ফ্লেক্সিবল।

সারসংক্ষেপ

Moq Framework ব্যবহার করে ASP.NET Core অ্যাপ্লিকেশনের Unit Testing সহজ এবং কার্যকর হয়। এটি ডিপেনডেন্ট ক্লাস বা ইন্টারফেসের মক তৈরি করে টেস্টিং-এর সময় এক্সটার্নাল ডিপেনডেন্সি দূর করে। এর ফলে কোডের গুণগত মান বৃদ্ধি পায় এবং টেস্টিং দ্রুত এবং নির্ভরযোগ্য হয়। Moq Framework Unit Testing-এর জন্য একটি অত্যন্ত কার্যকর টুল।

common.content_added_by

Integration Testing এবং Test Driven Development (TDD)

238
238

Integration Testing কী?

Integration Testing হলো সফটওয়্যার টেস্টিংয়ের একটি ধাপ, যেখানে একাধিক উপাদান বা মডিউলকে একত্রে পরীক্ষা করা হয়। উদ্দেশ্য হলো, নিশ্চিত হওয়া যে, বিভিন্ন মডিউল বা সিস্টেমের উপাদানগুলো একে অপরের সাথে সঠিকভাবে কাজ করছে। এই ধরনের টেস্টিংয়ের মাধ্যমে সিস্টেমের ইন্টিগ্রেশন পয়েন্টগুলি এবং ডেটা প্রবাহের ভুলগুলো শনাক্ত করা হয়।

Integration Testing এর লক্ষ্য:

  1. একাধিক মডিউলের ইন্টারঅ্যাকশন পরীক্ষা: যখন একাধিক মডিউল একসাথে কাজ করে, তখন তাদের ইন্টারঅ্যাকশন সঠিক কিনা তা নিশ্চিত করা।
  2. ডাটাবেস, API, বা এক্সটার্নাল সিস্টেমের সাথে ইন্টিগ্রেশন পরীক্ষা: বিভিন্ন উপাদান যেমন ডাটাবেস, API বা অন্য কোনো এক্সটার্নাল সিস্টেমের সাথে সঠিক যোগাযোগ হচ্ছে কিনা তা পরীক্ষা করা।
  3. প্রধান ফিচারের একযোগ কাজ করা: অ্যাপ্লিকেশনের প্রধান ফিচারগুলি একত্রে কাজ করছে কিনা তা যাচাই করা।

Integration Testing কিভাবে করবেন?

ASP.NET Core-এ Integration Testing করতে হলে কিছু টুল এবং প্রক্রিয়া অনুসরণ করতে হবে। আপনি xUnit, NUnit, বা MSTest এর মতো টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করতে পারেন।

Integration Testing উদাহরণ:

ধরা যাক, আমাদের একটি API আছে যা ডাটাবেস থেকে ব্যবহারকারীর তথ্য ফেরত দেয়। এই API টেস্ট করতে আমরা নিম্নলিখিত টেস্ট লিখতে পারি।

  1. প্রথমে Test Project তৈরি করুন:
dotnet new xunit -n MyApp.IntegrationTests
  1. Integration Test Setup:

Test Project ফোল্ডারে TestServer এবং WebApplicationFactory ব্যবহার করে অ্যাপ্লিকেশনকে ইনিশিয়ালাইজ করুন।

public class UserApiIntegrationTests : IClassFixture<WebApplicationFactory<Startup>>
{
    private readonly HttpClient _client;
    private readonly WebApplicationFactory<Startup> _factory;

    public UserApiIntegrationTests(WebApplicationFactory<Startup> factory)
    {
        _factory = factory;
        _client = factory.CreateClient();
    }

    [Fact]
    public async Task GetUser_ReturnsSuccessStatusCode()
    {
        var response = await _client.GetAsync("/api/users/1");
        response.EnsureSuccessStatusCode();  // Verifies 2xx status code
    }
}

এই কোডটি WebApplicationFactory ব্যবহার করে অ্যাপের API রুটে রিকোয়েস্ট পাঠাচ্ছে এবং প্রাপ্ত রেসপন্স যাচাই করছে।


Test Driven Development (TDD) কী?

Test Driven Development (TDD) হলো একটি সফটওয়্যার ডেভেলপমেন্ট প্রক্রিয়া, যেখানে প্রথমে টেস্ট লেখা হয় এবং তারপর সেই টেস্টটি পাস করার মতো কোড লেখা হয়। এই প্রক্রিয়াটি কোডের গুণগত মান উন্নত করে এবং সফটওয়্যার ডেভেলপমেন্টে আরও স্থিতিশীলতা আনে।

TDD এর মূল নিয়ম:

  1. লিখুন টেস্ট: প্রথমে একটি টেস্ট লিখুন যা বর্তমান ফিচারের জন্য সঠিক ফলাফল প্রত্যাশা করে।
  2. কোড লিখুন: টেস্টটি পাস করার জন্য প্রয়োজনীয় কোড লিখুন।
  3. টেস্ট চালান: কোড চালিয়ে দেখুন, টেস্টটি পাস হচ্ছে কিনা।
  4. কোড রিফ্যাক্টর করুন: প্রয়োজনীয় উন্নতি বা ক্লিনআপ করুন।
  5. ধাপগুলো পুনরাবৃত্তি করুন: আরও নতুন ফিচার যোগ করার জন্য এই ধাপগুলো আবার করুন।

TDD এর উদাহরণ:

ধরা যাক, আমাদের একটি ফাংশন তৈরি করতে হবে যা দুটি সংখ্যা যোগ করবে। প্রথমে TDD পদ্ধতিতে টেস্ট লিখি।

১. টেস্ট লিখুন (Red Phase):

public class MathTests
{
    [Fact]
    public void Add_ReturnsCorrectSum()
    {
        // Arrange
        var math = new MathOperations();

        // Act
        var result = math.Add(1, 2);

        // Assert
        Assert.Equal(3, result);
    }
}

এখানে আমরা Add ফাংশনটির জন্য একটি টেস্ট লিখেছি, যেখানে 1 এবং 2 যোগ করার পর প্রত্যাশিত ফলাফল 3 হওয়া উচিত।

২. কোড লিখুন (Green Phase):

এখন কোড লিখি যাতে টেস্টটি পাস হয়।

public class MathOperations
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

৩. টেস্ট চালান (Green Phase):

টেস্টটি চালালে, এটি পাস করবে এবং Add ফাংশনটি সঠিকভাবে কাজ করবে।

৪. কোড রিফ্যাক্টর করুন (Refactor Phase):

এখন কোডটি পরিষ্কার বা আরও উন্নত করা যায়, যদি প্রয়োজন হয়।


TDD এবং Integration Testing এর সম্পর্ক

  • Integration Testing একাধিক উপাদান একত্রে কাজ করছে কিনা তা পরীক্ষা করে, যেখানে TDD ফিচারটি ছোট ছোট ইউনিট বা ফাংশনালিটি পরীক্ষা করতে সহায়ক।
  • TDD আপনি কোডের এক একটি ছোট অংশ পরীক্ষা করতে পারেন, এবং পরবর্তীতে Integration Testing ব্যবহার করে সেই ছোট অংশগুলি একসাথে পরীক্ষিত হবে, অর্থাৎ একাধিক মডিউল একযোগে সঠিকভাবে কাজ করছে কিনা তা যাচাই করা।
  • TDD প্রথমে টেস্ট লেখার উপর জোর দেয়, এবং পরে সেই টেস্টটি পাস করার জন্য কোড লেখা হয়, যা কনফিডেন্টলি ইন্টিগ্রেশন টেস্টের জন্য প্রস্তুতি গ্রহণ করতে সহায়ক।

সারাংশ

Integration Testing এবং Test Driven Development (TDD) হল দুটি গুরুত্বপূর্ণ সফটওয়্যার ডেভেলপমেন্ট কৌশল। Integration Testing ব্যবহারকারীর সিস্টেমের ইন্টিগ্রেশন পয়েন্টগুলো পরীক্ষা করতে সহায়ক, যেখানে TDD আপনার কোডের গুণগত মান এবং স্থায়িত্ব নিশ্চিত করতে সহায়ক। TDD কোড লেখার আগে টেস্ট তৈরি করে এবং সেই টেস্ট পাস করার জন্য কোড লেখার প্রক্রিয়া অনুসরণ করে, যা সিস্টেমের প্রতিটি ইউনিট ও উপাদানের সঠিক কার্যকারিতা নিশ্চিত করে। Integration Testing-এ একাধিক সিস্টেম বা মডিউলের একসাথে কাজ করা যাচাই করা হয়, যা সফটওয়্যারের বড় স্তরের টেস্টিং প্রক্রিয়া।

common.content_added_by

ASP.NET Core MVC এবং Web API Test করার পদ্ধতি

196
196

ASP.NET Core অ্যাপ্লিকেশনের জন্য ইউনিট টেস্ট এবং ইন্টিগ্রেশন টেস্ট খুবই গুরুত্বপূর্ণ। এগুলি আপনার অ্যাপ্লিকেশনের কোডের গুণগত মান নিশ্চিত করতে এবং নতুন ফিচার যোগ করার সময় পূর্ববর্তী ফিচারগুলির সঠিকতা বজায় রাখতে সাহায্য করে। এখানে আমরা আলোচনা করব কিভাবে ASP.NET Core MVC এবং Web API টেস্ট করা যায়।


1. ASP.NET Core MVC টেস্ট করা

ASP.NET Core MVC অ্যাপ্লিকেশনের জন্য টেস্ট তৈরি করতে হলে, প্রথমে আপনাকে Unit Test এবং Integration Test কনসেপ্টের মধ্যে পার্থক্য বুঝতে হবে। MVC টেস্টে সাধারণত Controller এর একশন মেথডগুলোর জন্য টেস্ট করা হয়।

1.1 Unit Test তৈরি করা

Unit Testing তে, আমরা নির্দিষ্ট একটি ইউনিট (যেমন Controller, Service) টেস্ট করি। আমরা xUnit বা NUnit টেস্ট ফ্রেমওয়ার্ক ব্যবহার করতে পারি। এখানে xUnit এর উদাহরণ দেওয়া হলো।

  1. xUnit ইনস্টল করা:

    • প্রথমে আপনার টেস্ট প্রজেক্টে xUnit প্যাকেজ ইনস্টল করতে হবে।
    dotnet add package xunit
    dotnet add package Microsoft.AspNetCore.Mvc.Testing
    dotnet add package Moq
    
  2. Controller Test করা:

    • MVC Controller-এ যে ফিচার টেস্ট করতে চান তার জন্য একটি টেস্ট ক্লাস তৈরি করুন।

    উদাহরণস্বরূপ, যদি আপনি HomeController টেস্ট করতে চান:

    public class HomeControllerTests
    {
        private readonly HomeController _controller;
        private readonly Mock<IProductService> _mockService;
    
        public HomeControllerTests()
        {
            _mockService = new Mock<IProductService>();
            _controller = new HomeController(_mockService.Object);
        }
    
        [Fact]
        public async Task Index_ReturnsAViewResult_WithAListOfProducts()
        {
            // Arrange
            _mockService.Setup(service => service.GetProducts())
                        .ReturnsAsync(new List<Product> { new Product { Id = 1, Name = "Product 1" } });
    
            // Act
            var result = await _controller.Index();
    
            // Assert
            var viewResult = Assert.IsType<ViewResult>(result);
            var model = Assert.IsAssignableFrom<List<Product>>(viewResult.ViewData.Model);
            Assert.Single(model);
        }
    }
    

    এখানে, Moq ব্যবহার করে IProductService এর মক তৈরি করা হয়েছে এবং HomeController এর Index একশন টেস্ট করা হয়েছে।

1.2 Integration Test তৈরি করা

Integration Test-এ, আমরা পুরো অ্যাপ্লিকেশন বা কন্ট্রোলার ইন্টিগ্রেশন টেস্ট করি। ASP.NET Core-এ WebApplicationFactory ব্যবহার করে Integration Test করা হয়।

  1. WebApplicationFactory ইনস্টল করা: Web API টেস্টের মতো MVC টেস্টের জন্যও Microsoft.AspNetCore.Mvc.Testing প্যাকেজ ইনস্টল করতে হবে।
  2. Integration Test উদাহরণ:

    public class HomeControllerIntegrationTests : IClassFixture<WebApplicationFactory<Startup>>
    {
        private readonly WebApplicationFactory<Startup> _factory;
    
        public HomeControllerIntegrationTests(WebApplicationFactory<Startup> factory)
        {
            _factory = factory;
        }
    
        [Fact]
        public async Task Index_ReturnsSuccessStatusCode()
        {
            // Arrange
            var client = _factory.CreateClient();
    
            // Act
            var response = await client.GetAsync("/Home/Index");
    
            // Assert
            response.EnsureSuccessStatusCode();
        }
    }
    

    এখানে, WebApplicationFactory ব্যবহার করে আমরা পুরো অ্যাপ্লিকেশনকে মক করে HomeController এর Index একশন টেস্ট করেছি।


2. ASP.NET Core Web API টেস্ট করা

ASP.NET Core Web API এর জন্য Integration Test তৈরি করা হয়, যাতে API এর রেসপন্স, স্ট্যাটাস কোড, এবং কনটেন্ট টেস্ট করা যায়। আমরা xUnit, Microsoft.AspNetCore.Mvc.Testing, এবং HttpClient ব্যবহার করব।

2.1 Web API Integration Test তৈরি করা

  1. API টেস্ট তৈরি করা: Web API এর টেস্টে, সাধারণত HttpClient ব্যবহার করে API রিকোয়েস্ট করা হয় এবং রেসপন্স চেক করা হয়।
  2. API Controller Test উদাহরণ:

    public class ProductsControllerTests : IClassFixture<WebApplicationFactory<Startup>>
    {
        private readonly WebApplicationFactory<Startup> _factory;
    
        public ProductsControllerTests(WebApplicationFactory<Startup> factory)
        {
            _factory = factory;
        }
    
        [Fact]
        public async Task GetProducts_ReturnsOkResponse()
        {
            // Arrange
            var client = _factory.CreateClient();
    
            // Act
            var response = await client.GetAsync("/api/products");
    
            // Assert
            response.EnsureSuccessStatusCode();
            var products = await response.Content.ReadAsStringAsync();
            Assert.Contains("Product", products);
        }
    }
    

    এখানে, আমরা WebApplicationFactory ব্যবহার করে API কল করলাম এবং GetAsync মেথড ব্যবহার করে Products API টেস্ট করলাম।

2.2 Mocking External Dependencies

অনেক সময়, Web API এর Controller গুলি এক্সটার্নাল সার্ভিস বা ডেটাবেসের সাথে যোগাযোগ করতে পারে। এই ধরনের ডিপেনডেন্সি মক করা গুরুত্বপূর্ণ। নিচে Moq ব্যবহার করে মক করা উদাহরণ দেখানো হলো।

public class ProductsControllerTests
{
    private readonly ProductsController _controller;
    private readonly Mock<IProductService> _mockService;

    public ProductsControllerTests()
    {
        _mockService = new Mock<IProductService>();
        _controller = new ProductsController(_mockService.Object);
    }

    [Fact]
    public async Task GetProduct_ReturnsOkResult_WithProduct()
    {
        // Arrange
        _mockService.Setup(service => service.GetProduct(1))
                    .ReturnsAsync(new Product { Id = 1, Name = "Product 1" });

        // Act
        var result = await _controller.GetProduct(1);

        // Assert
        var actionResult = Assert.IsType<ActionResult<Product>>(result);
        var okResult = Assert.IsType<OkObjectResult>(actionResult.Result);
        var product = Assert.IsType<Product>(okResult.Value);
        Assert.Equal(1, product.Id);
    }
}

এখানে, IProductService এর মক তৈরি করা হয়েছে এবং ProductsController এর GetProduct একশন টেস্ট করা হয়েছে।


3. ASP.NET Core MVC এবং Web API টেস্টে কিছু গুরুত্বপূর্ণ টিপস

  • ডেটাবেস মকিং: যদি আপনার API বা Controller ডেটাবেসের সাথে কাজ করে, তাহলে InMemory Database বা Moq ব্যবহার করে ডেটাবেস মক করতে পারেন।
  • Auth Token: যদি API অথেনটিকেশন ব্যবহার করে, তাহলে টেস্টে JWT বা Cookies মক করতে হবে।
  • Test Coverage: নিশ্চিত করুন যে আপনার টেস্ট কাভারেজ যথেষ্ট, বিশেষ করে রিকোয়েস্ট, রেসপন্স, এবং স্ট্যাটাস কোড চেক করা।
  • Test Isolation: টেস্টগুলি একে অপর থেকে বিচ্ছিন্ন থাকতে হবে, অর্থাৎ একটি টেস্টের ফলাফল অন্য টেস্টের ওপর প্রভাব ফেলবে না।

সারাংশ

ASP.NET Core MVC এবং Web API টেস্ট করার জন্য, আপনাকে Unit Test এবং Integration Test এর মধ্যে পার্থক্য বুঝতে হবে। xUnit এবং Moq এর মতো টেস্ট ফ্রেমওয়ার্ক ব্যবহার করে আপনি Controller এর একশন টেস্ট করতে পারেন এবং WebApplicationFactory ব্যবহার করে আপনি পুরো API বা MVC অ্যাপ্লিকেশন ইন্টিগ্রেশন টেস্ট করতে পারেন। টেস্ট করা আপনাকে অ্যাপ্লিকেশন উন্নয়নে সহায়তা করবে এবং কোডের সঠিকতা নিশ্চিত করবে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion